<?php

class PedidoModel extends GenericModel {
	public function __construct() {
		$this -> setTableName('tb_pedido');
		parent::__construct();
	}

	public function buscarPedidoPorId($id, $clienteId = NULL, $sessionId = NULL){
		
		$params = array();
		
		$params['id'] = $id;
		
		$querySql = "SELECT 
					    sped.nome as status,
					    ped.id,
					    ped.id_status,
					    ped.id_cliente,
					    ped.id_restaurante,
					    ped.obs_pedido,
					    ped.dt_pedido,
					    ped.id_forma_pagamento,
					    ped.qtd_troco,
					    ped.tempo_entrega,
					    ped.retirada,
					    ped.taxa_entrega,
					    ped.session_id,
					    ped.taxa_entrega + (sum((pr.preco + (SELECT 
					                                IFNULL(SUM(dif_preco),0) 
					                             FROM 
					                                tb_variacao_produto_pedido 
					                             WHERE 
					                                id_produto_pedido = pp.id
					                            )) * pp.qtde)) AS preco
					FROM 
					    tb_pedido ped
					    INNER JOIN tb_status_pedido sped ON ( ped.id_status = sped.id)
					    INNER JOIN tb_produto_pedido pp ON ped.id = pp.id_pedido
					    INNER JOIN tb_produto pr ON pp.id_produto = pr.id
					WHERE
					    ped.id = :id";
            
            if($clienteId){
              $querySql.=" AND ped.id_cliente = :id_cliente";
              $params['id_cliente'] = $clienteId;
            }  
            
            if($sessionId){
              $querySql.=" AND ped.session_id = :session_id";
              $params['session_id'] = $sessionId;
            }
						
			return $this->query($querySql, $params, TRUE); 
	}

	public function buscarPedidoPorRestaurante($restauranteId, $id = NULL){
			
		$param = array();
		$param[0] = $restauranteId;
				
		$querySql = "SELECT 
					    sped.nome as status,
					    ped.id,
					    ped.id_status,
					    ped.id_cliente,
					    ped.id_restaurante,
					    ped.obs_pedido,
					    ped.dt_pedido,
					    ped.id_forma_pagamento,
					    ped.qtd_troco,
					    ped.tempo_entrega,
					    ped.retirada,
					    ped.taxa_entrega,
					    ped.session_id,
					    ped.taxa_entrega + (sum((pr.preco + (SELECT 
					                                IFNULL(SUM(dif_preco),0) 
					                             FROM 
					                                tb_variacao_produto_pedido 
					                             WHERE 
					                                id_produto_pedido = pp.id
					                            )) * pp.qtde)) AS preco
					FROM 
					    tb_pedido ped
					    INNER JOIN tb_status_pedido sped ON ( ped.id_status = sped.id)
					    INNER JOIN tb_produto_pedido pp ON ped.id = pp.id_pedido
					    INNER JOIN tb_produto pr ON pp.id_produto = pr.id
					WHERE
					    sped.id IN (2,3,4) AND
					    ped.id_restaurante = ?";
						
		if(!is_null($id)){
			$querySql .= " AND ped.id > ?";
			$param[1] = $id;
		}
		
		$querySql .= ' GROUP BY ped.id';
		
		$res = $this -> query($querySql, $param);
		
		return $res;			
	}
	
	public function buscarProdutosPorPedido($pedidoId){
		
		$sqlQuery = "SELECT 
						    pe.id id_pedido, 
						    pr.id id_produto, 
						    pp.id id_produto_pedido, 
						    pp.observacoes,
						    pp.qtde, pr.nome,
						    (pr.preco + (SELECT 
						                    IFNULL(SUM(dif_preco),0) 
						                 FROM 
						                    tb_variacao_produto_pedido 
						                 WHERE 
						                    id_produto_pedido = pp.id
						                )) * pp.qtde as preco
						FROM 
						    tb_pedido pe 
						    INNER JOIN tb_produto_pedido pp ON pe.id = pp.id_pedido 
						    INNER JOIN tb_produto pr ON pp.id_produto = pr.id
						WHERE pe.id = ? AND pp.ativo = 1";
						
		return $this->query($sqlQuery, array($pedidoId));						
	}
  
  public function buscarVariacoesPorProdutoPedido($produtoPedidoId){
    $sqlQuery = " SELECT 
                      va.id id_variacao, iv.id id_item_variacao, va.nome variacao, iv.nome item, vpp.dif_preco preco
                  FROM
                      tb_variacao_produto_pedido vpp
                          INNER JOIN
                      tb_produto_pedido pp ON vpp.id_produto_pedido = pp.id
                          INNER JOIN
                      tb_variacao va ON vpp.id_variacao = va.id
                          INNER JOIN
                      tb_item_variacao iv ON vpp.id_item_variacao = iv.id
                  WHERE
                      pp.id = ?;";
    return $this->query($sqlQuery, array($produtoPedidoId));
  }
  
  public function buscarPedidosPorStatus($usuarioId, $tipoUsuario = 'r', $arrStatus){
    $sqlQuery = "SELECT
                pe.id id_pedido,
                pe.id_restaurante,
                pe.dt_pedido data,
                re.nome,
                st.nome status,
                pe.taxa_entrega + (sum((pr.preco + (SELECT 
                                IFNULL(SUM(dif_preco),0) 
                             FROM 
                                tb_variacao_produto_pedido 
                             WHERE 
                                id_produto_pedido = pp.id
                            )) * pp.qtde)) AS preco
                FROM
                  tb_pedido pe 
                  INNER JOIN tb_restaurante re ON pe.id_restaurante = re.id
                  INNER JOIN tb_produto_pedido pp ON pe.id = pp.id_pedido
                  INNER JOIN tb_produto pr ON pp.id_produto = pr.id
                  INNER JOIN tb_status_pedido st ON pe.id_status = st.id 
                WHERE
                id_status IN (".join(',',$arrStatus).") AND";
    if($tipoUsuario == 'c'){
      $sqlQuery.= " pe.id_cliente = ?";
    }
    else {
      $sqlQuery.=" pe.id_restaurante = ?"; 
    }
    
    return $this->query($sqlQuery, array($usuarioId));
  }
  
  public function enviarPedido($pedido){
    $this->transaction();
    try{
    $sqlQuery = "UPDATE tb_pedido SET 
                  id_status = 2,  
                  dt_pedido = NOW(),
                  id_forma_pagamento = :id_forma_pagamento,
                  qtd_troco = :qtde_troco,
                  retirada = :retirada,
                  taxa_entrega = IFNULL(:taxa_entrega, taxa_entrega)
                WHERE id = :id_pedido
                  AND id_status = 1
                  AND id_cliente = :id_cliente
                  AND id_restaurante = :id_restaurante
                  AND session_id = :session_id;";
   
    $ret = $this->execute($sqlQuery, $pedido);
    
    $sqlQuery = "INSERT INTO tb_historico_status_pedido VALUES (NULL, ?, 2, NOW(), NULL);";
    $this->execute($sqlQuery, ARRAY($pedido['id_pedido']));
    $this->commit();
    }
    catch(Exception $err){
      $this->rollback();
      $ret = $err;
    }
    return $ret;
  }
  
  public function alteraStatusPedido($pedido){
    $this->transaction();
    try{
      $this->saveOrUpdate($pedido);
      
      $sqlQuery = "INSERT INTO tb_historico_status_pedido VALUES (NULL, ?, ?, NOW(), ?);";
      $this->execute($sqlQuery, array($pedido->id,$pedido->id_status,$pedido->observacoes));
      $this->commit();
    }
    catch(Exception $err){
      $this->rollback();
    }
  }
}
?>